/**
*DataMessage用于Client发送消息给服务器,
服务器根据消息内容进行相应反馈.
*/
#ifndef __DATAMESSAGE_H__
#define __DATAMESSAGE_H__
#include <stdio.h>
#include <stdlib.h>
#include "DataStates.h"
#define EXT_BUFFER_SIZE 256
#define PATH_LENGTH 256
#define FILENA_LENGTH 32
//命令种类，只是指最本质的命令种类
typedef enum ENUM_MESSAGE_TYPE
{
    EMT_NONE = 0,
    //客户端本地命令
    //本地命令,cose，关闭客户端
    EMT_LCLOSE = 1,
    //指定本地默认文件夹，!cd D:\ftpin
    EMT_LCD=2,
    //显示本地制定文件夹的内容!dir
    EMT_LDIR = 3,
    //退出登录状态bye
    EMT_LBYE = 4,

    //网络命令
    //回复标志型消息
    EMT_NFLAG = 10,
    //链接服务器open *.*.*.* port
    EMT_NOPEN = 11,
    //登录user,name ,password
    EMT_NUSER = 12,
    //显示当前目录下的文件,dir
    EMT_NDIR = 13,
    //进入文件夹,cd a型命令,其中返回上一层和根目录是本地命令
    EMT_NCD = 14,
    //创建文件夹,mkdir filename
    EMT_NMKDIR = 15,
    //删除,文件夹及mrdir name,如果有文件或者目录则不能删除
    EMT_NMRDIR = 16,
    //上传文件put filename,上传到网络当前目录
    EMT_NPUT  = 17,
    //下载文件,get filename 下载到本地当前目录
    EMT_NGET = 18,
    //除,文件夹及其下一切文件delete filename
    EMT_NDELETE = 19,
}EnumMessageType;

//cd 命令的种类
typedef enum ENUM_CD_TYPE
{
    //cd a/b/c
    ECT_INTO = 0,
    //cd ..
    ECT_BACK = 1,
    /*cd \*/
    ECT_ROOT = 2,
}EnumCdType;

//网络cd 命令的结构体
typedef struct StructCDCommond
{
    EnumCdType mEnumNetCDType;
    char mPath[PATH_LENGTH];
}SCDCommond;

//用于处理open命令的结构
typedef struct StructNetOpenCommond
{
    char mIpAddrress[16];
    char mPort[8];
}SNetOpenCommond;

//用于处理put,get 命令的结构体
typedef struct StructNetPutGetCommond
{
    char mFrom[PATH_LENGTH];
    char mTo[PATH_LENGTH];
    char mFilename[FILENA_LENGTH];
}SNetPutGetCommond;


//消息结构体
typedef struct DataMessage
{
    EnumMessageType msgtype;
    SUserStates mUserStates;
    /*额外的缓存，用于存放:cd 路径--完整的路径,delete,mkdir,mrdir 的文件(夹)名
    *也换成!cd 路径--已经处理过的完整的路径,
    */
    //char mExtBuffer[EXT_BUFFER_SIZE];
    union
    {
        //其中有两个被本地处理了
        SCDCommond mNetCDCommond;
        SCDCommond mLocalCDCommond;
        SNetOpenCommond mNetOpenCommond;
        SNetPutGetCommond mNetPutGetCommond;
    };
}SDataMessage,*pSDataMessage;
#endif // __DATAMESSAGE_H__
